package TestDemo.example.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;
import java.util.Map;

/**
 * JWT工具类，包含生成和解析令牌的核心方法
 */
public class JwtUtils {

    // 令牌过期时间：12小时（单位：毫秒）
    private static final long EXPIRATION_TIME = 12 * 60 * 60 * 1000;

    // 签名密钥，实际应用中建议通过配置文件注入
    private static final Key SIGNING_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    /**
     * 生成JWT令牌
     * @param claims 自定义声明（可包含用户角色、权限等信息）
     * @param subject 令牌主题（通常为用户名或用户ID）
     * @return 生成的JWT令牌字符串
     */
    public static String generateToken(Map<String, Object> claims, String subject) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setClaims(claims)          // 设置自定义声明
                .setSubject(subject)        // 设置主题
                .setIssuedAt(now)           // 设置签发时间
                .setExpiration(expirationDate) // 设置过期时间
                .signWith(SIGNING_KEY)      // 设置签名密钥
                .compact();                 // 生成令牌
    }

    /**
     * 解析JWT令牌
     * @param token 要解析的JWT令牌字符串
     * @return 令牌中包含的声明信息
     */
    public static Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SIGNING_KEY)  // 设置签名密钥（需与生成时使用的密钥一致）
                .build()
                .parseClaimsJws(token)       // 解析令牌
                .getBody();                  // 获取声明信息
    }
}
    